/*
 * FCKeditor - The text editor for Internet - http://www.fckeditor.net Copyright
 * (C) 2003-2007 Frederico Caldeira Knabben
 *  == BEGIN LICENSE ==
 * 
 * Licensed under the terms of any of the following licenses at your choice:
 *  - GNU General Public License Version 2 or later (the "GPL")
 * http://www.gnu.org/licenses/gpl.html
 *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
 * http://www.gnu.org/licenses/lgpl.html
 *  - Mozilla Public License Version 1.1 or later (the "MPL")
 * http://www.mozilla.org/MPL/MPL-1.1.html
 *  == END LICENSE ==
 * 
 * This is the integration file for JavaScript.
 * 
 * It defines the FCKeditor class that can be used to create editor instances in
 * a HTML page in the client side. For server side operations, use the specific
 * integration system.
 */

// FCKeditor Class
var FCKeditor = function(instanceName, width, height, toolbarSet, value) {
	// Properties
	this.InstanceName = instanceName;
	this.Width = width || '100%';
	this.Height = height || '200';
	this.ToolbarSet = toolbarSet || 'Default';
	this.Value = value || '';
	this.BasePath = '/fckeditor/';
	this.CheckBrowser = true;
	this.DisplayErrors = true;
	this.EnableSafari = false; // This is a temporary property, while Safari
								// support is under development.
	this.EnableOpera = false; // This is a temporary property, while Opera
								// support is under development.

	this.Config = new Object();

	// Events
	this.OnError = null; // function( source, errorNumber, errorDescription )
}

FCKeditor.prototype.Version = '2.4.2';
FCKeditor.prototype.VersionBuild = '14978';

FCKeditor.prototype.Create = function() {
	document.write(this.CreateHtml());
}

FCKeditor.prototype.CreateHtml = function() {
	// Check for errors
	if (!this.InstanceName || this.InstanceName.length == 0) {
		this._ThrowError(701, 'You must specify an instance name.');
		return '';
	}

	var sHtml = '<div>';

	if (!this.CheckBrowser || this._IsCompatibleBrowser()) {
//		sHtml += '<input type="hidden" id="' + this.InstanceName + '" name="'
//				+ this.InstanceName + '" value="'
//				+ this._HTMLEncode(this.Value) + '" style="display:none" />';
		sHtml += this._GetConfigHtml();
		sHtml += this._GetIFrameHtml();
	} else {
		var sWidth = this.Width.toString().indexOf('%') > 0
				? this.Width
				: this.Width + 'px';
		var sHeight = this.Height.toString().indexOf('%') > 0
				? this.Height
				: this.Height + 'px';
		sHtml += '<textarea name="' + this.InstanceName
				+ '" rows="4" cols="40" style="width:' + sWidth + ';height:'
				+ sHeight + '">' + this._HTMLEncode(this.Value)
				+ '<\/textarea>';
	}

	sHtml += '</div>';

	return sHtml;
}

FCKeditor.prototype.ReplaceTextarea = function() {
	if (!this.CheckBrowser || this._IsCompatibleBrowser()) {
		// We must check the elements firstly using the Id and then the name.
		var oTextarea = document.getElementById(this.InstanceName);
		var colElementsByName = document.getElementsByName(this.InstanceName);
		var i = 0;
		while (oTextarea || i == 0) {
			if (oTextarea && oTextarea.tagName.toLowerCase() == 'textarea')
				break;
			oTextarea = colElementsByName[i++];
		}

		if (!oTextarea) {
			alert('Error: The TEXTAREA with id or name set to "'
					+ this.InstanceName + '" was not found');
			return;
		}

		oTextarea.style.display = 'none';
		this._InsertHtmlBefore(this._GetConfigHtml(), oTextarea);
		this._InsertHtmlBefore(this._GetIFrameHtml(), oTextarea);
	}
}

FCKeditor.prototype._InsertHtmlBefore = function(html, element) {
	if (element.insertAdjacentHTML) // IE
		element.insertAdjacentHTML('beforeBegin', html);
	else // Gecko
	{
		var oRange = document.createRange();
		oRange.setStartBefore(element);
		var oFragment = oRange.createContextualFragment(html);
		element.parentNode.insertBefore(oFragment, element);
	}
}

FCKeditor.prototype._GetConfigHtml = function() {
	var sConfig = '';
	for (var o in this.Config) {
		if (sConfig.length > 0)
			sConfig += '&amp;';
		sConfig += encodeURIComponent(o) + '='
				+ encodeURIComponent(this.Config[o]);
	}

	return '<input type="hidden" id="' + this.InstanceName
			+ '___Config" value="' + sConfig + '" style="display:none" />';
}

FCKeditor.prototype._GetIFrameHtml = function() {
	var sFile = 'fckeditor.html';

	try {
		if ((/fcksource=true/i).test(window.top.location.search))
			sFile = 'fckeditor.original.html';
	} catch (e) { /*
					 * Ignore it. Much probably we are inside a FRAME where the
					 * "top" is in another domain (security error).
					 */
	}

	var sLink = this.BasePath + sFile + '?InstanceName='
			+ encodeURIComponent(this.InstanceName);
	if (this.ToolbarSet)
		sLink += '&amp;Toolbar=' + this.ToolbarSet;

	return '<iframe id="' + this.InstanceName + '___Frame" src="' + sLink
			+ '" width="' + this.Width + '" height="' + this.Height
			+ '" frameborder="0" scrolling="no"></iframe>';
}

FCKeditor.prototype._IsCompatibleBrowser = function() {
	return FCKeditor_IsCompatibleBrowser(this.EnableSafari, this.EnableOpera);
}

FCKeditor.prototype._ThrowError = function(errorNumber, errorDescription) {
	this.ErrorNumber = errorNumber;
	this.ErrorDescription = errorDescription;

	if (this.DisplayErrors) {
		document.write('<div style="COLOR: #ff0000">');
		document.write('[ FCKeditor Error ' + this.ErrorNumber + ': '
				+ this.ErrorDescription + ' ]');
		document.write('</div>');
	}

	if (typeof(this.OnError) == 'function')
		this.OnError(this, errorNumber, errorDescription);
}

FCKeditor.prototype._HTMLEncode = function(text) {
	if (typeof(text) != "string")
		text = text.toString();

	text = text.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g,
			"&lt;").replace(/>/g, "&gt;");

	return text;
}

function FCKeditor_IsCompatibleBrowser(enableSafari, enableOpera) {
	var sAgent = navigator.userAgent.toLowerCase();

	// Internet Explorer
	if (sAgent.indexOf("msie") != -1 && sAgent.indexOf("mac") == -1
			&& sAgent.indexOf("opera") == -1) {
		var sBrowserVersion = navigator.appVersion.match(/MSIE (.\..)/)[1];
		return (sBrowserVersion >= 5.5);
	}

	// Gecko (Opera 9 tries to behave like Gecko at this point).
	if (navigator.product == "Gecko" && navigator.productSub >= 20030210
			&& !(typeof(opera) == 'object' && opera.postError))
		return true;

	// Opera
	if (enableOpera && navigator.appName == 'Opera'
			&& parseInt(navigator.appVersion, 10) >= 9)
		return true;

	// Safari
	if (enableSafari && sAgent.indexOf('safari') != -1)
		return (sAgent.match(/safari\/(\d+)/)[1] >= 312); // Build must be at
															// least 312 (1.3)

	return false;
}